/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package control;

import commande.Command;
import entity.Client;
import entity.Description;
import entity.Commande;
import entity.EtatCommande;
import entity.Langue;
import entity.Produit;
import entity.TypeProduit;
import entity.Utilisateur;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import mail.CreateMail;
import managers.CommandManager;
import managers.ProduitEtDescrip;
import managers.ProduitManager;
import managers.UserManager;
import panier.Cart;
import panier.CartItem;
import session.ClientFacade;
import session.CommandeFacade;
import session.DescriptionFacade;
import session.EtatCommandeFacade;
import session.LangueFacade;
import session.PaysClientFacade;
import session.ProduitFacade;
import session.RelationTypesFacade;
import session.TypeProduitFacade;
import session.UtilisateurFacade;

// URL disponibles
@WebServlet(name = "ControllerServlet", loadOnStartup = 1,
urlPatterns = {"/command",
    "/commandes",
    "/changer",
    "/userinf",
    "/useradmin",
    "/logon",
    "/register",
    "/logout",
    "/login",
    "/category",
    "/product",
    "/cart",
    "/contact",
    "/subcategory",
    "/addcart",
    "/clearcart",
    "/summary",
    "/loginpan",
    "/payment",
    "/confirm",
    "/dopayment",
    "/search",
    "/bonsplans",
    "/newpass",
    "/dopass",
    "/changelangue",
    "/topventes"})
public class ControlServlet extends HttpServlet {

    @EJB
    private ClientFacade clientFacade;
    @EJB
    private UtilisateurFacade utilisateurFacade;
    @EJB
    private UserManager userManager;
    @EJB
    private LangueFacade langueFacade;
    @EJB
    private PaysClientFacade paysClientFacade;
    @EJB
    private TypeProduitFacade typeProduitFacade;
    @EJB
    private ProduitManager produitManager;
    @EJB
    private ProduitFacade produitFacade;
    @EJB
    private CommandeFacade commandeFacade;
    @EJB
    private CommandManager commandManager;
    @EJB
    private DescriptionFacade descriptionFacade;
    @EJB
    private RelationTypesFacade relationTypesFacade;
    @EJB
    private EtatCommandeFacade etatCommandeFacade;
    private String productid;
    private CreateMail createMail = new CreateMail();
    private Langue defaultLangue = new Langue(1);

    @Override
    public void init() throws ServletException {

        getServletContext().setAttribute("pays", paysClientFacade.findAll());

        /* Création d'une liste de produits avec des remises, et de leurs description */
        List<Produit> listprodremise = produitFacade.findProduitWithRemise();
        List<ProduitEtDescrip> decsremise = new ArrayList<ProduitEtDescrip>();
        for (Produit p : listprodremise) {
            Description desc = produitManager.getDescripByProductEtLang(defaultLangue, p);
            ProduitEtDescrip prodEtDesc = new ProduitEtDescrip(p, desc);
            decsremise.add(prodEtDesc);
        }
        getServletContext().setAttribute("decsremise", decsremise);

        /* Création d'une liste de produits ayant comptabilisé le plus de ventes, et de leurs description */
        List<Produit> listtopvente = produitFacade.findProduitTop();
        List<ProduitEtDescrip> decstop = new ArrayList<ProduitEtDescrip>();
        for (Produit p : listtopvente) {
            Description desc = produitManager.getDescripByProductEtLang(defaultLangue, p);
            ProduitEtDescrip prodEtDesc = new ProduitEtDescrip(p, desc);
            decstop.add(prodEtDesc);
        }
        getServletContext().setAttribute("decstop", decstop);
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String userPath = request.getServletPath();
        HttpSession session = request.getSession();

        //TODO recuperer la langue
        boolean urlToDo = true;
        String categ = "";
        String url = "";
         
        
        
        // Categories
        if (userPath.equals("/category")) {
            userPath = "/category";
            categ = request.getQueryString();
            TypeProduit typeProd = typeProduitFacade.findTypeProduitById((categ), defaultLangue);
            List<TypeProduit> subtypesReturn = produitManager.getSubtypesByType(categ, defaultLangue);
            request.setAttribute("typeProduit", typeProd);
            request.setAttribute("listSubtypes", subtypesReturn);
            // Sous-categories
        } else if (userPath.equals("/subcategory")) {
            userPath = "/subcategory";
            categ = request.getQueryString();
            TypeProduit typeProd = typeProduitFacade.findTypeProduitById((categ), defaultLangue);
            List<ProduitEtDescrip> listProduits = produitManager.getProdEtDescrip(defaultLangue, typeProd, false);
            int parentCategory = relationTypesFacade.findTypeBySubcategorie(Integer.parseInt(categ));
            TypeProduit parent = typeProduitFacade.findTypeProduitById("" + parentCategory, defaultLangue);
            request.setAttribute("typeProduit", typeProd);
            request.setAttribute("listProduitsEtDescrip", listProduits);
            request.setAttribute("parent", parent);
            // Fiche Produit
        } else if (userPath.equals("/product")) {
            userPath = "/product";
            productid = request.getQueryString();
            Produit prod = produitFacade.findProduitById(productid);
            Description desc = produitManager.getDescripByProductEtLang(defaultLangue, prod);
            ProduitEtDescrip ProdEtDesc = new ProduitEtDescrip(prod, desc);
            TypeProduit categorie = typeProduitFacade.findTypeProduitById(String.valueOf(prod.getIdTypeProdGenerique()), defaultLangue);
            TypeProduit subtype = typeProduitFacade.findTypeProduitById("" + prod.getIdTypeProdSpecifique(), defaultLangue);
            request.setAttribute("prodEtDesc", ProdEtDesc);
            request.setAttribute("categorie", categorie);
            request.setAttribute("subcategorie", subtype);
            // Panier
        } else if (userPath.equals("/cart")) {
            if (session.getAttribute("usercart") == null) {
                session.setAttribute("usercart", new Cart());
            }
            Cart c = (Cart) session.getAttribute("usercart");
            for (CartItem i : c.getItems()) {
                i.setName(descriptionFacade.findByProductLangue(i.getProduct(), defaultLangue).getDescriptionBref());
            }
            userPath = "/cart";

            // Page de contact
        } else if (userPath.equals("/contact")) {
            userPath = "/contact";

        } else if (userPath.equals("/logout")) {
            Cart c = (Cart) session.getAttribute("usercart");
            session.invalidate();
            url = "/index.jsp";
            urlToDo = false;

        } else if (userPath.equals("/logon")) {
            userPath = "/register";
            getServletContext().setAttribute("langues", langueFacade.findAll());

        } else if (userPath.equals("/userinf")) {
            Utilisateur ut = utilisateurFacade.findByUser((String) session.getAttribute("clientloged"));
            Client clientaux = ut.getIdClient();
            session.setAttribute("clientData", ut.getIdClient());
            session.setAttribute("nomc", clientaux.getNom().split("#")[0]);
            session.setAttribute("prenomc", clientaux.getNom().split("#")[1]);
            session.setAttribute("cityc", clientaux.getAdresse().split("#")[0]);
            session.setAttribute("adressec", clientaux.getAdresse().split("#")[1]);
            GregorianCalendar cal = new GregorianCalendar();
            cal.setTime(clientaux.getDateNaissance());
            session.setAttribute("dayc", cal.get(Calendar.DAY_OF_MONTH));
            if (cal.get(Calendar.MONTH) == 0) {
                session.setAttribute("monthc", 12);
            } else {
                session.setAttribute("monthc", cal.get(Calendar.MONTH));
            }
            session.setAttribute("yearc", cal.get(Calendar.YEAR));

            getServletContext().setAttribute("langues", langueFacade.findAll());
            getServletContext().setAttribute("pays", paysClientFacade.findAll());

            userPath = "/userAdministration";

        } else if (userPath.equals("/commandes")) {
            userPath = "/commandes";
            Utilisateur ut = utilisateurFacade.findByUser((String) session.getAttribute("clientloged"));
            List<EtatCommande> etats = etatCommandeFacade.getEtatsByLangue(defaultLangue);
            session.setAttribute("commandes", commandeFacade.findByClient(ut.getIdClient()));
            session.setAttribute("etats", etats);

        } else if (userPath.equals("/command")) {
            userPath = "/commandDetail";
            Command c = commandManager.loadCommand(Integer.parseInt(request.getQueryString()), langueFacade.find(1));
            getServletContext().setAttribute("commande", c);

            // Ajout panier
        }  else if(userPath.equals("/addcart")){
            userPath = "/cart";
            int idp = Integer.parseInt((String) request.getParameter("id"));
            Cart c = (Cart) session.getAttribute("usercart");
            c.update(produitFacade.find(idp), (String) request.getParameter("u"));
            session.setAttribute("usercart", c);
            
        } else if (userPath.equals("/summary")) {
            userPath = "/summary";

            // Paiement
        } else if (userPath.equals("/payment")) {
            userPath = "/payment";
            Utilisateur ut = utilisateurFacade.findByUser((String) session.getAttribute("clientloged"));
            Client c = ut.getIdClient();
            c.setNom(c.getNom().replace("#", ", "));
            c.setAdresse(c.getAdresse().replace("#", ", "));
            session.setAttribute("userinfo", c);

            // Confirmer commande
        } else if (userPath.equals("/confirm")) {
            userPath = "/confirm";
            Cart c = (Cart) session.getAttribute("usercart");

        } else if (userPath.equals("/newpass")) {
            userPath = "/newpass";
        }else if(userPath.equals("/changelangue")){
            url = "/index.jsp";
            urlToDo = false;
            
            session.setAttribute("defaultlangue", request.getParameter("langue"));
            
            if(request.getParameter("langue").equals("es")){
                this.defaultLangue = new Langue(3);
            } else if(request.getParameter("langue").equals("en")){
                this.defaultLangue = new Langue(2);
            } else {
                this.defaultLangue = new Langue(1); 
            }
            getServletContext().setAttribute("pays", paysClientFacade.findAll());

            /* Création d'une liste de produits avec des remises, et de leurs description */
            List<Produit> listprodremise = produitFacade.findProduitWithRemise();
            List<ProduitEtDescrip> decsremise = new ArrayList<ProduitEtDescrip>();
            for (Produit p : listprodremise) {
                Description desc = produitManager.getDescripByProductEtLang(defaultLangue, p);
                ProduitEtDescrip prodEtDesc = new ProduitEtDescrip(p, desc);
                decsremise.add(prodEtDesc);
            }
            getServletContext().setAttribute("decsremise", decsremise);

            /* Création d'une liste de produits ayant comptabilisé le plus de ventes, et de leurs description */
            List<Produit> listtopvente = produitFacade.findProduitTop();
            List<ProduitEtDescrip> decstop = new ArrayList<ProduitEtDescrip>();
            for (Produit p : listtopvente) {
                Description desc = produitManager.getDescripByProductEtLang(defaultLangue, p);
                ProduitEtDescrip prodEtDesc = new ProduitEtDescrip(p, desc);
                decstop.add(prodEtDesc);
            }
            getServletContext().setAttribute("decstop", decstop);
        }



        if (urlToDo) {
            url = "/WEB-INF/view" + userPath + ".jsp";
        }
        try {
            request.getRequestDispatcher(url).forward(request, response);
        } catch (Exception ex) {
        }
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String userPath = request.getServletPath();
        HttpSession session = request.getSession();
        String search = "";
        String errors = "";
        String url = "";
        boolean urlToDo = true;
        

        if (userPath.equals("/login")) {
            Utilisateur user = utilisateurFacade.findByLogin(request.getParameter("user"), UserManager.md5(request.getParameter("password")));
            urlToDo = false;
            if (user != null) {
                session.setAttribute("clientloged", user.getLogin());
                if (user.getIdClient().getIdType() == 1) {
                    session.setAttribute("admin", true);
                }
                url = "/index.jsp";
            } else {
                url = "/index.jsp?error=1";
                urlToDo = false;
            }
        } else if (userPath.equals("/loginpan")) {
            Utilisateur user = utilisateurFacade.findByLogin(request.getParameter("user"), UserManager.md5(request.getParameter("password")));
            userPath = "/summary";

            if (user != null) {
                session.setAttribute("clientloged", user.getLogin());
                if (user.getIdClient().getIdType() == 1) {
                    session.setAttribute("admin", true);
                }

            } else {
                errors = "?error=1";

            }

        } else if (userPath.equals("/register")) {
            Utilisateur user = utilisateurFacade.findByUser(request.getParameter("user"));
            if (user != null) {
                //Ya existe
                urlToDo = false;
                url = "/WEB-INF/view/registro.jsp?error=1"; //user already registered
            } else {
                //guarar cliente, crear clase para hacerlo, queda mejor
                Client client = userManager.createCustomer(request.getParameter("nom"), request.getParameter("prenom"), request.getParameter("mail"), request.getParameter("phone"), request.getParameter("address"), request.getParameter("city"), request.getParameter("addresscomp"), request.getParameter("url"), false, Integer.parseInt(request.getParameter("langue")), Integer.parseInt(request.getParameter("pays")), Integer.parseInt(request.getParameter("jour")), Integer.parseInt(request.getParameter("mois")), Integer.parseInt(request.getParameter("annee")));
                user = userManager.createUtilisateur(request.getParameter("user"), request.getParameter("pass"), client);
                urlToDo = false;
                url = "/index.jsp?exito=1";
            }
            // TODO: Implement purchase action
            //si bien?
            userPath = "/finreg";

        } else if (userPath.equals("/changer")) {
            Client c = (Client) session.getAttribute("clientData");
            if (request.getParameter("pass") != null && ((String) request.getParameter("pass")).length() > 0) {
                userManager.updatePassword((String) session.getAttribute("clientloged"), (String) request.getParameter("pass"));
            }
            userManager.updateCustomer(c, request.getParameter("nom"), request.getParameter("prenom"), request.getParameter("mail"), request.getParameter("phone"), request.getParameter("address"), request.getParameter("city"), request.getParameter("addresscomp"), request.getParameter("url"), Integer.parseInt(request.getParameter("langue")), Integer.parseInt(request.getParameter("pays")), Integer.parseInt(request.getParameter("jour")), Integer.parseInt(request.getParameter("mois")), Integer.parseInt(request.getParameter("annee")));
            urlToDo = false;
            url = "/index.jsp?exito=3";

        } else if (userPath.equals("/addcart")) {
            if (session.getAttribute("usercart") == null) {
                session.setAttribute("usercart", new Cart());
            }
            userPath = "/cart";
            Cart c = (Cart) session.getAttribute("usercart");

            c.addItem(produitFacade.find(Integer.parseInt((String) request.getParameter("productid"))), Integer.parseInt((String) request.getParameter("quantity")));
            
            for (CartItem i : c.getItems()) {
                i.setName(descriptionFacade.findByProductLangue(i.getProduct(), defaultLangue).getDescriptionBref());
            }
            if(request.getParameter("page") != null){
                userPath = "/"+request.getParameter("page");
            }
            session.setAttribute("usercart", c);

        } else if (userPath.equals("/clearcart")) {
            if (session.getAttribute("usercart") == null) {
                session.setAttribute("usercart", new Cart());
            }
            userPath = "/cart";
            Cart c = (Cart) session.getAttribute("usercart");
            c.clear();
            session.setAttribute("usercart", c);

        } else if (userPath.equals("/dopayment")) {
            userPath = "/summary";
            if (commandManager.doCommand((Cart) session.getAttribute("usercart"))) {
                Commande cde = commandManager.saveCommand(utilisateurFacade.findByUser((String) session.getAttribute("clientloged")).getIdClient(), (Cart) session.getAttribute("usercart"), (String) request.getAttribute("commentaire"));
                session.setAttribute("usercart", new Cart());
                userPath = "/commandDetail";
                Command c = commandManager.loadCommand(cde, langueFacade.find(1));
                getServletContext().setAttribute("commande", c);
                try{
                    createMail.sendMail((Cart) session.getAttribute("usercart"), cde, defaultLangue.getIdlangue(), cde.getIdclient());
                }catch(Exception e){
                    
                }
                session.setAttribute("usercart", new Cart());
            }


            // Recherche par mot-cle
        } else if (userPath.equals("/search")) {
            search = request.getParameter("search");
            if (!search.equalsIgnoreCase("")) {
                List<Produit> searchProd = produitFacade.findByTag(search);
                List<ProduitEtDescrip> searchProdEtDesc = new ArrayList<ProduitEtDescrip>();

                if (searchProd != null) {
                    for (Produit p : searchProd) {
                        Description descProdSearch = produitManager.getDescripByProductEtLang(defaultLangue, p);
                        ProduitEtDescrip prodEtDescSearch = new ProduitEtDescrip(p, descProdSearch);
                        searchProdEtDesc.add(prodEtDescSearch);
                    }
                }
                request.setAttribute("tag", search);
                request.setAttribute("searchprods", searchProdEtDesc);
            } else {
                request.setAttribute("tag", "");
                request.setAttribute("searchprods", null);
            }

        } else if (userPath.equals("/dopass")) {
            urlToDo = false;
            if(userManager.newPass(request.getParameter("nom"), request.getParameter("mail"), defaultLangue)){             
                url = "/WEB-INF/index.jsp";
            }else{
                url = "/WEB-INF/view/newpass.jsp?error=5";
            }
        }
        if (urlToDo) {
            url = "/WEB-INF/view" + userPath + ".jsp";
        }
        try {
            request.getRequestDispatcher(url).forward(request, response);
        } catch (Exception ex) {
        }
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
